home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Your Choice 3
/
Your Choice Software Collection 3.iso
/
prgmming
/
flames
/
flames.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-08-27
|
3KB
|
126 lines
program flames;
{**************************************************************************}
{* *}
{* FLAMES by M.D.Mackey (C) 1993 *}
{* This code released into the public domain. It may be freely *}
{* used, distributed and modified. I would appreciate it if *}
{* credit were given, however. If you have any improvements, *}
{* find any bugs etc. mail me at mackey@aqueous.ml.csiro.au *}
{* with MARK: in the subject header. *}
{* *}
{**************************************************************************}
uses crt;
type bigarr=array[0..102,0..159] of integer;
var f:bigarr;
i,j,k,l:word;
delta:integer;
pal:array[0..255,1..3] of byte;
ch:char;
procedure setmode13;
assembler;
asm
mov ax,13h
int 10h
end;
procedure setpalette;
var mapfile:text;
i,j:integer;
begin
assign(mapfile,'flames5.map'); {kludgy, but it works!}
reset(mapfile);
for i:=0 to 255 do
for j:=1 to 3 do
begin
read(mapfile,pal[i,j]);
pal[i,j]:=pal[i,j] shr 2;
end;
asm
mov si,offset pal
mov cx,768 {no of colour registers}
mov dx,03c8h
xor al,al {First colour to change pal for = 0}
out dx,al
inc dx
@1: outsb
dec cx {safer than rep outsb}
jnz @1
end;
end;
begin
setmode13;
setpalette;
randomize;
ch:=' ';
for i:=0 to 102 do
for j:=0 to 159 do
f[i,j]:=0; {initialise array}
repeat
asm {move lines up, averaging}
mov cx,16159; {no. elements to change}
mov di,offset f
add di,320 {di points to 1st element of f in upper row (320 bytes/row)}
@1:
mov ax,ds:[di-2]
add ax,ds:[di]
add ax,ds:[di+2]
add ax,ds:[di+320]
shr ax,2 {divide by 4: average 4 elements of f}
jz @2
sub ax,1
@2: mov word ptr ds:[di-320],ax
add di,2
dec cx
jnz @1 {faster than _loop_ on 486}
end;
for j:=0 to 159 do {set new bottom line}
begin
if random<0.4 then
delta:=random(2)*255;
f[101,j]:=delta;
f[102,j]:=delta;
end;
asm {output to screen}
mov si,offset f
mov ax,0a000h
mov es,ax
mov di,0
mov dx,100
@3:
mov bx,2
@2:
mov cx,160
@1:
mov al,[si]
mov ah,al
mov es:[di],ax {word aligned write to display mem}
add di,2
add si,2
dec cx
jnz @1
sub si,320
dec bx
jnz @2
add si,320
dec dx
jnz @3
end;
if keypressed then ch:=readkey;
until ch=#27;
asm {restore text mode}
mov ax,03h
int 10h
end;
end.